
/*******************************************************************************
 * Copyleft (c) 2021 Kcode
 *
 * @file    bmp.c
 * @brief   处理bmp文件的坐标信息，计算实现缩放
 * @author  K
 * @version 0.0.1
 * @date    2021-07-26
 * @license MulanPSL-1.0
 *
 * 文件修改历史：
 * <时间>       | <版本>    | <作者>  | <描述>
 * 2021-07-02   | v0.0.1    | Kcode   | 处理bmp文件的坐标信息
 * -----------------------------------------------------------------------------
 ******************************************************************************/

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include "pic_operation.h"
#include "debug_manager.h"

/*!
 * @brief  对图片数据处理进行实现缩放，采用近邻取样插值
 * @param ptOriginPic[in]  内含原始图片的象素数据
 * @param ptZoomPic[in]    内含缩放后的图片的象素数据
 * @return 0 - 成功缩放，-1 - 不支持缩放
 */
int PicZoom(PT_PIXELDATAS ptOriginPic, PT_PIXELDATAS ptZoomPic)
{
	unsigned long x, y;
	unsigned long PixelBytes;
	unsigned long SrcY;
    unsigned long DstWidth;
    unsigned long *pSrcXTable;
	unsigned char *pDest;
	unsigned char *pSrc;

	if (ptOriginPic->bpp != ptZoomPic->bpp) {
		DebugPrint(APP_NOTICE"can not support bpp where the source %d and destination %d are different\n"
					, ptOriginPic->bpp, ptZoomPic->bpp);
		return -1;
	}
	
	DstWidth = ptZoomPic->width;
	PixelBytes = ptOriginPic->bpp / 8;

	/* 分配空间 */
	pSrcXTable = (unsigned long *)malloc(sizeof(unsigned long) * DstWidth);
	if (pSrcXTable == NULL) {
		DebugPrint(APP_ERR"pSrcXTable malloc err\n");
		return -1;
	}

	/* 获取源图片一行中像素点的x坐标 */
    for (x = 0; x < DstWidth; x++)
        pSrcXTable[x]=(x * ptOriginPic->width / ptZoomPic->width);

	/* 计算缩放后的坐标信息 */
    for (y = 0; y < ptZoomPic->height; y++) {
		SrcY = (y * ptOriginPic->height / ptZoomPic->height);		//获取源图片一列中像素点的y坐标

		pSrc  = ptOriginPic->PixelDatas + SrcY * ptOriginPic->linebytes;	//原图每行起始像素在内存的地址
		pDest = ptZoomPic->PixelDatas    + y * ptZoomPic->linebytes;	//缩放图每行起始像素在内存的地址

		/* 原图坐标：(pSrcXTable[x], SrcY)
		 * 缩放坐标：(x, y)
		 */
        for (x = 0; x < DstWidth; x++){
			memcpy(pDest + x * PixelBytes, pSrc + pSrcXTable[x] * PixelBytes, PixelBytes); 
        }
    }

	/* 释放空间 */
    free(pSrcXTable);

	return 0;
}
